数据双向绑定原理：

前置内容
1.reduce:
    求和：

2.链式获取对象的属性：
  reduce 可以链式获取 对象的值

3 发布订阅模式：
    A微博 ：  a1，a2 a3....关注
    A发生变化 ，微博会给 a1 a2 a3...关注者  推送这个消息  
    A发布者  a1，a2 ... 订阅者
    微博平台 成为调度中心
    关注者  和 A 没有直接的往来

4.名词：
    setter  --> set  设置 有参  不需要return***
    getter  --->get   取值 无参
        用来访问和设置对象的属性的

5 object.defineProperty 
    定义新属性或修改原有属性
    defineProperty（目标对象，属性名,特性）

    在设置 或 获取 属性的时候 自动调用 get和 set方法
  
6 双向绑定的原理：

    vue
        this.num 
        this.属性名称
        vm.属性名称

    数据渲染：

小结：
    创建 MyVue对象，包括根节点id，数据json
    MyVue类：
        数据放到了 this.$data
        定义数据劫持，递归遍历所有下标，递归绑定 set 和 get方法
        代理属性劫持，把所有的数据 以属性的形式绑定到 MyVeu对象上
        模板编译：提取{{}} 根据节点类型 替换插值中的文本
        调用发布订阅模式：
          替换数据位置创建订阅者，通过数据发生变化
          Dep 把所有订阅者放到 数组中 ，调用watcher回调，当数据变化，调用vm的get方法
          在get方法中 把watcher放到 sub数组中
          当数据变化的时候，通过notify 通知所有的watcher ，watcher该更新自己的DOM

        页面中的输入框如果发生变化：
            捕获输入框的v-model中的value
            监听input输入，当输入变化的时候，更新 模板中的数据
    
    补充：
        vue3中 数据劫持 new Proxy() set 和 get方法
        区别：
           defineProperty ：不能为添加的属性 添加 set和 get
           prosy 可以为添加的属性 添加 get 和 set 

